/**
 * 文件功能描述: 服务端启动入口
 * 使用default export导出函数，
 * 并在每次渲染中重复调用此函数;
 */
import { createApp } from '@/app.js'

export default context => {
  return new Promise((resolve, reject) => {
    const { app, router, store } = createApp(context.cookies)

    // 设置服务器端 router 的位置
    router.push(context.url)

    // 等到 router 将可能的异步组件和钩子函数解析完
    router.onReady(() => {
      store.commit('initToken', context.cookies) // 将cookie信息注册到store里

      context.rendered = () => {
        // 我们的 store 现在已经填充入渲染应用程序所需的状态。
        // 当我们将状态附加到上下文，
        // 并且 `template` 选项用于 renderer 时，
        // 状态将自动序列化为 `window.__INITIAL_STATE__`，并注入 HTML;
        // 在entry-client.js中进行客户端渲染时使用;
        context.state = store.state
      }

      const matchedComponents = router.getMatchedComponents()
      // 匹配不到的路由，执行 reject 函数，并返回 404
      if (!matchedComponents.length) {
        return reject({ code: 404 })
      }

      // Promise 应该 resolve 应用程序实例，以便它可以渲染
      resolve(app)
    }, reject)
  })
}